# include "poligono.h"

Poligono::Poligono()
{
	invX = invY = false;
}

Poligono::Poligono(Punto a, Punto b, Punto c)
{
	puntos.push_back(a);
	
	puntos.push_back(b);
	
	puntos.push_back(c);
	
	invX = invY = false;
}

Poligono::Poligono(Punto a[], int tam)
{
	for (int i = 0; i < tam; i++)
	{
		puntos.push_back(a[i]);
	}

	invX = invY = false;	
}

void
Poligono::trasladar(float x, float y)
{
	for (list<Punto>::iterator i = puntos.begin(); i != puntos.end(); i++)
	{
		i->trasladar(x,y);
	}
}

Punto
Poligono::supIzq()
{
	float x1, y1;
	
	x1 = puntos.begin()->getX();
	
	y1 = puntos.begin()->getY();
	
	for (list<Punto>::iterator i = puntos.begin(); i != puntos.end(); i++)
	{
		if (i->getX() < x1)
		{
			x1 = i->getX();
		}

		if (i->getY() > y1)
		{
			y1 = i->getY();
		}
	}	
	
	Punto p(x1, y1);
	
	return (p);
}
	
Punto
Poligono::infDer()
{
	float x2, y2;
	
	x2 = puntos.begin()->getX();
	
	y2 = puntos.begin()->getY();
	
	for (list<Punto>::iterator i = puntos.begin(); i != puntos.end(); i++)
	{
		if (i->getX() > x2)
		{
			x2 = i->getX();
		}
		
		if (i->getY() < y2)
		{
			y2 = i->getY();
		}
	}	
	
	Punto p(x2, y2);
	
	return (p);	
}

string
Poligono::Texto(int tab)
{
	string ret = "";
	
	for (int i = 0; i < tab; i++) ret += '\t';
	
	ret += "Polígono:\n";
	
	for (list<Punto>::iterator i = puntos.begin(); i != puntos.end(); i++)
	{
		ret += i->Texto(tab + 1);
	}	
	
	return (ret);
}

bool
Poligono::contenida(Punto a, Punto b)
{
	Punto si = supIzq();
	
	Punto id = infDer();
	
	return ((si.getX() >= a.getX()) && (id.getX() <= b.getX()) 
			&& (si.getY() <= a.getY()) && (id.getY() >= b.getY()));
}

bool
Poligono::seleccionar (float x, float y)
{
	bool salida = false;
	
	Punto si = supIzq();
	
	Punto id = infDer();
	
	if ((x > si.getX()) && (x < id.getX()) && (y < si.getY()) && (y > id.getY()))
	{
		salida = true;
	}
	
	return (salida);
}

void 
Poligono::redimensionar (float x, float y)
{
	Punto si = supIzq();
	
	Punto id = infDer();
	
	float tamX = id.getX() - si.getX();
	
	float tamY = id.getY() - si.getY();

	for (list<Punto>::iterator i = puntos.begin(); i != puntos.end(); i++)
	{
		if (invX)
		{
			if (invY)
			{
				i->trasladar((x * (0.5 - (i->getX() - si.getX()) / tamX)), (y * (0.5 - (i->getY() - si.getY()) / tamY)));	
			}
			
			else
			{
				i->trasladar((x * (0.5 - (i->getX() - si.getX()) / tamX)), (-y * (0.5 - (i->getY() - si.getY()) / tamY)));	
			}
		}
		
		else
		{
			if (invY)
			{
				i->trasladar((-x * (0.5 - (i->getX() - si.getX()) / tamX)), (y * (0.5 - (i->getY() - si.getY()) / tamY)));	
			}
			
			else
			{
				i->trasladar((-x * (0.5 - (i->getX() - si.getX()) / tamX)), (-y * (0.5 - (i->getY() - si.getY()) / tamY)));	
			}
		}
	}		
	
	if (invX)
	{
		if (invY)
		{
			id.trasladar(-x/2, -y/2);
			
			si.trasladar(x/2, y/2);
		}
		
		else
		{
			id.trasladar(-x/2, y/2);
			
			si.trasladar(x/2, -y/2);
		}
	}
	
	else
	{
		if (invY)
		{
			id.trasladar(x/2, -y/2);
			
			si.trasladar(-x/2, y/2);
		}
		
		else
		{
			id.trasladar(x/2, y/2);
			
			si.trasladar(-x/2, -y/2);
		}
	}
	
	if (signo(tamX) != signo(id.getX() - si.getX()))
	{
		invX = !invX;
	}
	
	if (signo(tamY) != signo(id.getY() - si.getY()))
	{
		invY = !invY;
	}	
} 

list<Figura*> 
Poligono::pintar()
{
	list<Figura*> ret;
	
	for (list<Punto>::iterator i = puntos.begin(); i != puntos.end(); i++)
	{
		list<Punto>::iterator j = i;
		
		j++;
		
		if (j == puntos.end())
		{
			j = puntos.begin();
		}
		
		Linea *l = new Linea (*i, *j);
		
		l->setCR(getCR());
		
		l->setCB(getCB());
		
		l->setCG(getCG());
		
		ret.push_back(l);
	}
	
	return (ret);
}
